﻿

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;


namespace Eixos3D
{

    /// <summary>
    /// Classe que cria um objeto que desenha os eixos 3d na tela
    /// </summary>
    /// 

    class classeEixos3D
    {

        /// <summary>
        /// O dispositivo gráfico 
        /// </summary>
        private GraphicsDevice device;

        /// <summary>
        /// O conjunto de vértices que será desenhado na tela
        /// </summary>
        private VertexBuffer vertexBuffer;

        /// <summary>
        /// O efeito que será utilizado para fazer o desenho 3D
        /// </summary>
        private BasicEffect effect;


        /// <summary>
        /// A matriz que representa as transformações do mundo virtual. São 3: pra rotação, translação e escala
        /// </summary>
        public Matrix rotationMatrix = Matrix.Identity;
        public Matrix scaleMatrix = Matrix.Identity;
        public Matrix translationMatrix = Matrix.Identity;



        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="graphicsDevice"></param>
        public classeEixos3D(GraphicsDevice graphicsDevice)
        {
            device = graphicsDevice;

            effect = new BasicEffect(device);

            // Cria a matriz de câmera (View), uma das 3 matrizes básicas do 3D
            effect.View =
                Matrix.CreateLookAt(//cria a camera
                new Vector3(0.0f, 2.0f, 2.0f), //nesta posição
                Vector3.Zero, //olhando pra cá
                Vector3.Up); // virado pra cima;

            // Cria a matriz de câmera (Projection) de projeção.
            effect.Projection =
                Matrix.CreatePerspectiveFieldOfView(//"tela"
                        MathHelper.ToRadians(45.0f),//abertura
                        device.Viewport.AspectRatio,//proporção, a própria placa de video passa.
                        1.0f,//"near". O quão perto o objeto tem de estar para 'sumir', ou seja, não mostrar algo distorcido
                        10.0f);//"far". View Distance. O quão longe tem de estar para não mostrar.

            //effect.LightingEnabled = false;
            effect.VertexColorEnabled = true; // Usa-se para criar uma das linhas (x,y,z) com cor diferente

            Create3DAxis();

        } // fim do construtor

        public void UnloadContent()
        {

        }

        /// <summary>
        /// definição dos desenhos dos objetos 3D
        /// </summary>
        /// 

        private void Create3DAxis()
        {
            float axisLength = 1f; //Tamanho das linhas
            int vertexCount = 6;

            VertexPositionColor[] vertices = new VertexPositionColor[vertexCount];

            // X (vermelho)
            vertices[0] = new VertexPositionColor(new Vector3(-axisLength, 0.0f, 0.0f), Color.Red);
            vertices[1] = new VertexPositionColor(new Vector3(axisLength, 0.0f, 0.0f), Color.Red);

            // Y (verde)
            vertices[2] = new VertexPositionColor(new Vector3(0.0f, -axisLength, 0.0f), Color.Green);
            vertices[3] = new VertexPositionColor(new Vector3(0.0f, axisLength, 0.0f), Color.Green);

            // Z (azul)
            vertices[4] = new VertexPositionColor(new Vector3(0.0f, 0.0f, -axisLength), Color.Blue);
            vertices[5] = new VertexPositionColor(new Vector3(0.0f, 0.0f, axisLength), Color.Blue);

            vertexBuffer = new VertexBuffer(device, VertexPositionColor.VertexDeclaration, vertexCount, BufferUsage.WriteOnly);

            vertexBuffer.SetData<VertexPositionColor>(vertices);


        }//fim Create3DAxis





        //Update
        public void Update(KeyboardState keyboard)
        {





        }//fim da update


        public void Draw()
        {
            effect.World = rotationMatrix * scaleMatrix * translationMatrix;



            device.SetVertexBuffer(vertexBuffer);


            foreach (EffectPass CurrentPass in effect.CurrentTechnique.Passes)
            {
                CurrentPass.Apply();
                device.DrawPrimitives(PrimitiveType.LineList, 0, 3);
            }
            

        }//fim da draw



    }
}
